#include <panel.h>
#include <ncurses.h>
#include <string.h>

#include <network.h>
#include <MyInterface.h>


WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x);
WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x);

WINDOW *chat_border, *chat, *log_border, *log, *list_clients_border, *list_clients;	
char name[12]={0};
char msg[256]={0}, send_msg[256]={0};
int pointer=0, i=0;
	
//=====================Окошечко=регистрации=======================================
void connect1()
{
	mvprintw(1, COLS/2,"CHAT");
	mvprintw(3, COLS/4,"Input you name: ");
	
	curs_set(TRUE);
	echo ();
do{

	refresh();
	attrset(COLOR_PAIR(1));
	if (scanw("%12s", name)==-1){
		attrset(COLOR_PAIR(3));
		mvprintw(3, COLS/4,"Warning - input you name: ");
	}
	else{
		clear();
		refresh();
		mvprintw(3, COLS/4,"Name: %s", name);
		break;
	}
	
	
}while(1);
sending(sockfd, REQID, NULL);
sending(sockfd, CHANGENAME, name);
}


void show_chat()
{
	log_border = newwin(18, COLS-COLS/3, 1, 1);				// для границ чата чата
	log = derwin(log_border, 16, COLS-38, 1, 1);	// для чата (сделано так чтобы границы не уничтожались)
	chat_border = newwin(5, 0, 19, 1);				// для границы окна сообщений
	chat = derwin(chat_border, 3, COLS-3, 1, 1);	// для написания сообщения
	list_clients_border = newwin(18, 0, 1, COLS-COLS/3+1);			// граница списка участников
	list_clients = derwin(list_clients_border, 16, COLS/3-3, 1, 1); // собственно сюда выводим список участников
	
    box(log_border, ACS_VLINE,ACS_HLINE);  
    wbkgd(log_border, COLOR_PAIR(1));      
    touchwin(log_border);
    wrefresh(log_border);   
         
    box(chat_border, ACS_VLINE,ACS_HLINE);  
    wbkgd(chat_border, COLOR_PAIR(1));        
    touchwin(chat_border);
    wrefresh(chat_border);  
	keypad (chat, TRUE);

    box(list_clients_border , ACS_VLINE,ACS_HLINE);  
    wbkgd(list_clients_border , COLOR_PAIR(1));      
    touchwin(list_clients_border);
    wrefresh(list_clients_border); 

	mvprintw(0, COLS-COLS/5,"MANS");
	mvprintw(0, COLS-3*COLS/4,"CHAT");
	noecho ();
    refresh();
    wrefresh(log);
	wrefresh(chat);
	wrefresh(list_clients);

	curs_set(FALSE); 					
	scrollok(log, TRUE);
	scrollok(chat, TRUE);

//	wprintw(list_clients, name);
	wrefresh(list_clients);
	refresh();

	int key='a';
	
	while(1){		
		if (key!=0x1B)		//|| (key !=0x09))
			key=getch();
		
		if (key==0x1B) break;	// Esc=выход	
		
	switch(key)	{
		case 0x09:		// TAB
			curs_set(TRUE); 
			key=message();
			curs_set(FALSE); 
    		break;
    	}
    }

	delwin(log_border);
	delwin(log);
	delwin(chat_border);
	delwin(chat);

}

/*
Здесь формируется сообщение и определяется его судьба - отослать или нет
*/
int message()
{
int exit=0, j, print_key;
int key;
wattrset(chat, COLOR_PAIR(1));

wrefresh(chat);

while(1){			// в строке 77 символов
	print_key=1;
	key=wgetch(chat);

	switch (key){
		case KEY_DOWN:
			key='1';
			break;
			
		case KEY_UP:
			key='2';
			break;

		case KEY_HOME:
			print_key=0;
			pointer=i;
			break;
			
		case KEY_END:
			print_key=0;
			pointer=0;
			break;

		case KEY_LEFT:
				print_key=0;
				if (i>pointer)
					(pointer)++;
				break;

		case KEY_RIGHT:
				print_key=0;
				if (pointer>0)
					(pointer)--;
			break;
		
		case '\n':	//enter
			if (i==0) return 0;
			if (i>229) i=229;
			msg[i]='\n';
			
			// БыдлокодMode=ON
			strcpy(send_msg, name);
			strcat(send_msg, ": ");
			strcat(send_msg, msg);
			
//			print_message(send_msg);
			// !!!ACHTUNG!!! Вот здесь тебе надо забирать сообщение
			sending(sockfd, BROADCAST, msg);
			
			for (j=0;j<i+1;j++)
				msg[j]='\0';
			i=pointer=0;
			exit=1;
			refresh();
			break;

		case KEY_BACKSPACE:
				print_key=0;
				if ((i<=229) && (i>0)){
					for (j=0;j<pointer;j++)
						msg[i-pointer+j-1]=msg[i-pointer+j];
					msg[i]=msg[i-1]='\0';
					(i)--;	
				}	
			break;	
			
		
		case KEY_DC:		// Delete		//case 0x7F:
				print_key=0;
				if ( (i<=229) && (i>0) && (pointer>0) ){
					for (j=0;j<pointer;j++)
						msg[i-pointer+j]=msg[i-pointer+j+1];
					msg[i]=msg[i-1]='\0';
					(i)--;	
					(pointer)--;	
				}	
			break;

		
		case 0x1B:	// esc
			return 0x1B;
			break;
		
		case 0x09:	//tab
			return 0x09;
			break;

		default:;
	}	

	if (exit==1) break;

	if (print_key==1){

		if (i<229)	{
			for (j=0;j<pointer;j++)
				msg[i-j]=msg[i-1-j];
			msg[i-pointer]=key;
			(i)++;	
		}	
		else wattrset(chat, COLOR_PAIR(3));
	}
	
	wclear(chat);
	wprintw(chat, msg);

	wmove(chat, (i-pointer)/(COLS-3), (i-pointer)%(COLS-3));	

	wrefresh(chat);

}

wclear(chat);
wrefresh(chat);
return 0;
}

void refresh_client_list(char *list_name)
{
	wprintw(list_clients, list_name);
	wrefresh(list_clients);
}
void cleanUserList(){
	wclear(list_clients);
	wrefresh(list_clients);
}



/*
!!!ACHTUNG!!!
*/
void print_message(char msg[256])
{
wprintw(log, msg);
wrefresh(log);
refresh();
}



/*
*/
void main_menu()
{
	initscr();
	keypad(stdscr, TRUE);
	start_color();
	refresh();
	init_pair(1, COLOR_WHITE, 0);	// Активная строка
	init_pair(2, COLOR_GREEN, 0);	// Активная строка
	init_pair(3, COLOR_RED, 0 );	// Предупреждение
	
	connect1();		// вот тут мы вводим имя
	show_chat();	// а тут уходим в чат


    endwin();  

}
